Add support for disabling middle click paste
authorBastien Nocera <hadess@hadess.net>
Wed, 30 Nov 2011 19:46:55 +0000 (20:46 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 4 May 2012 01:59:54 +0000 (21:59 -0400)
Adds a gtk-enable-primary-paste setting that is backed by
and X setting, and make GtkEntry and GtkTextView respect it.

https://bugzilla.gnome.org/show_bug.cgi?id=665243

gdk/x11/gdksettings.c
gtk/gtkentry.c
gtk/gtksettings.c
gtk/gtktextview.c

index eed43b5bd44321c32d213ef4fa802745c3a28b9c..15d73ba98d0f644f0ad1e4909dd1e54e3fc6dfbd 100644 (file)
@@ -81,7 +81,9 @@ static const char gdk_settings_names[] =
   "Gtk/AutoMnemonics\0"       "gtk-auto-mnemonics\0"
   "Gtk/VisibleFocus\0"        "gtk-visible-focus\0"
   "Gtk/ShellShowsAppMenu\0"   "gtk-shell-shows-app-menu\0"
-  "Gtk/ShellShowsMenubar\0"   "gtk-shell-shows-menubar\0";
+  "Gtk/ShellShowsMenubar\0"   "gtk-shell-shows-menubar\0"
+  "Gtk/EnablePrimaryPaste\0"  "gtk-enable-primary-paste\0";
+
 
 
 static const struct
@@ -137,5 +139,6 @@ static const struct
   { 1730, 1748 },
   { 1767, 1784 },
   { 1802, 1824 },
-  { 1849, 1871 }
+  { 1849, 1871 },
+  { 1895, 1918 }
 };
index 28bf32b5e4c3d7265fa9aa112feba85cb59999c0..22ff7ef07266cda627e74c2f94d4bf77458b558e 100644 (file)
@@ -572,6 +572,7 @@ static void         gtk_entry_move_adjustments         (GtkEntry             *en
 static GdkPixbuf *  gtk_entry_ensure_pixbuf            (GtkEntry             *entry,
                                                         GtkEntryIconPosition  icon_pos);
 static void         gtk_entry_update_cached_style_values(GtkEntry      *entry);
+static gboolean     get_middle_click_paste             (GtkEntry *entry);
 
 /* Completion */
 static gint         gtk_entry_completion_timeout       (gpointer            data);
@@ -3962,7 +3963,9 @@ gtk_entry_button_press (GtkWidget      *widget,
 
       return TRUE;
     }
-  else if (event->button == GDK_BUTTON_MIDDLE && event->type == GDK_BUTTON_PRESS)
+  else if (event->type == GDK_BUTTON_PRESS &&
+           event->button == GDK_BUTTON_MIDDLE &&
+           get_middle_click_paste (entry))
     {
       if (priv->editable)
         {
@@ -9157,6 +9160,18 @@ cursor_blinks (GtkEntry *entry)
     return FALSE;
 }
 
+static gboolean
+get_middle_click_paste (GtkEntry *entry)
+{
+  GtkSettings *settings;
+  gboolean paste;
+
+  settings = gtk_widget_get_settings (GTK_WIDGET (entry));
+  g_object_get (settings, "gtk-enable-primary-paste", &paste, NULL);
+
+  return paste;
+}
+
 static gint
 get_cursor_time (GtkEntry *entry)
 {
index 871c5e9f92015ff5b6456d01090a997a21244130..534ef021c52e071f0a9d48f6671707cadf5b8c56 100644 (file)
@@ -209,7 +209,8 @@ enum {
   PROP_IM_PREEDIT_STYLE,
   PROP_IM_STATUS_STYLE,
   PROP_SHELL_SHOWS_APP_MENU,
-  PROP_SHELL_SHOWS_MENUBAR
+  PROP_SHELL_SHOWS_MENUBAR,
+  PROP_ENABLE_PRIMARY_PASTE
 };
 
 /* --- prototypes --- */
@@ -1355,6 +1356,23 @@ gtk_settings_class_init (GtkSettingsClass *class)
                                              NULL);
   g_assert (result == PROP_SHELL_SHOWS_MENUBAR);
 
+  /**
+   * GtkSettings:gtk-enable-primary-paste:
+   *
+   * Whether a middle click on a mouse should paste the
+   * 'PRIMARY' clipboard content at the cursor location.
+   *
+   * Since: 3.4
+   */
+  result = settings_install_property_parser (class,
+                                             g_param_spec_boolean ("gtk-enable-primary-paste",
+                                                                   P_("Enable primary paste"),
+                                                                   P_("Whether a middle click on a mouse should paste the 'PRIMARY' clipboard content at the cursor location."),
+                                                                   TRUE,
+                                                                   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_ENABLE_PRIMARY_PASTE);
+
   g_type_class_add_private (class, sizeof (GtkSettingsPrivate));
 }
 
index 53e1004d4c9d654dcb8f22b7e8c70d3149867d65..66116733c00ac888315d4e1ca0ac31af654d82df 100644 (file)
@@ -338,7 +338,7 @@ static gboolean gtk_text_view_focus            (GtkWidget        *widget,
                                                 GtkDirectionType  direction);
 static void gtk_text_view_select_all           (GtkWidget        *widget,
                                                 gboolean          select);
-
+static gboolean get_middle_click_paste         (GtkTextView      *text_view);
 
 /* Source side drag signals */
 static void gtk_text_view_drag_begin       (GtkWidget        *widget,
@@ -4589,7 +4589,8 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
 
           return TRUE;
         }
-      else if (event->button == GDK_BUTTON_MIDDLE)
+      else if (event->button == GDK_BUTTON_MIDDLE &&
+               get_middle_click_paste (text_view))
         {
           GtkTextIter iter;
 
@@ -5052,6 +5053,18 @@ cursor_blinks (GtkTextView *text_view)
   return FALSE;
 }
 
+static gboolean
+get_middle_click_paste (GtkTextView *text_view)
+{
+  GtkSettings *settings;
+  gboolean paste;
+
+  settings = gtk_widget_get_settings (GTK_WIDGET (text_view));
+  g_object_get (settings, "gtk-enable-primary-paste", &paste, NULL);
+
+  return paste;
+}
+
 static gint
 get_cursor_time (GtkTextView *text_view)
 {